
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.*;

/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
/**
 * Clase que implementa la ventana principal del juego
 * @author Matías Díaz
 * @author Sergio Flores
 */
class JTetratexFrame extends JFrame implements ActionListener
{

    private JTetravexPanel panel;
    private JCronometro cronometro;
    private JBarraHerramientas barraHerramientas;
    private JBarraHerramientas barraHerramientasAux;
    private JBarraHerramientas barraHerramientasAux2;
    private boolean pause;
    
    /**
     * Metodo constructor que crea la ventana principal del juego.
     */
    public JTetratexFrame ()
    {
        super ( CommandName.NAME_SOFTWARE );
        super.setIconImage ( new ImageIcon ( CommandName.ICON_TETRAVEX ).getImage () );
        super.setDefaultCloseOperation ( EXIT_ON_CLOSE );
        super.setSize ( 1050 , 450 );
        super.setMinimumSize ( new Dimension ( 1050 , 450 ) );
        super.setLayout ( new BorderLayout () );
        this.createMenu ();
        this.panel = new JTetravexPanel ();

        this.barraHerramientas = new JBarraHerramientas ( this , true );
        this.barraHerramientasAux = new JBarraHerramientas ( this , false );
        this.barraHerramientasAux2 = new JBarraHerramientas ( this , false );
        this.pause = false;
        super.add ( this.panel , BorderLayout.CENTER );
        this.cronometro = new JCronometro ();
        super.add ( this.barraHerramientas , BorderLayout.PAGE_START );
        

        

    }
    /**
     * Metodo constructor que crea la ventana principal pidiendo dos parametros.
     * @param tamano tamano de la ventana
     * @param color  color de fondo.
     */
    public JTetratexFrame ( String tamano , Color color )
    {
        super ( CommandName.NAME_SOFTWARE );
        super.setIconImage ( new ImageIcon ( CommandName.ICON_TETRAVEX ).getImage () );
        super.setDefaultCloseOperation ( EXIT_ON_CLOSE );
        super.setSize ( 1050 , 450 );
        super.setMinimumSize ( new Dimension ( 1050 , 450 ) );
        super.setLayout ( new BorderLayout () );
        this.createMenu ();
        this.panel = new JTetravexPanel ( tamano , color );

        this.barraHerramientas = new JBarraHerramientas ( this , true );
        this.barraHerramientasAux = new JBarraHerramientas ( this , false );
        this.barraHerramientasAux2 = new JBarraHerramientas ( this , false );
        this.pause = false;
        super.add ( this.panel , BorderLayout.CENTER );
        this.cronometro = new JCronometro ();
        super.add ( this.barraHerramientas , BorderLayout.PAGE_START );
  
    }
    /**
     * Metodo que setea el glassPanel de la ventana
     * @param barra barra de herramientas que se agregara.
     * @param ruta ruta de la imagen de fondo.
     */
    public void seteaGlassPane(JBarraHerramientas barra , String ruta)
    {
        Panel panel2 = new Panel ();
        panel2.setLayout ( new BorderLayout () );
        panel2.add ( barra , BorderLayout.PAGE_START );
        panel2.add ( new JLabel ( new ImageIcon ( ruta ) ) , BorderLayout.CENTER );
        this.setGlassPane ( panel2 );
    }
    /**
     * Metodo que crea una nueva ventana para un juego nuevo.
     */
    private void newGame ()
    {
        this.dispose ();
        new JTetratexFrame ( this.panel.getTamano () , this.panel.getColor () ).setVisible ( true );
    }
    /**
     * Metodo que mostra la pausa o el final del juego.
     * @param barra barra de herramientas que se le pasara al panel.
     * @param opcion opcion de visibilidad de la ventana
     * @param ruta ruta de la imagen a pasarle al panel.
     */
    public void pausedOrOverGame ( JBarraHerramientas barra,boolean opcion,String ruta )
    {
        this.seteaGlassPane(barra, ruta);
        this.barraHerramientas.setPause ( opcion );
        barra.setPauseVisible ( opcion );
        this.getGlassPane ().setBackground ( Color.BLACK );
        this.getGlassPane ().setVisible ( opcion );
        this.getGlassPane ().setBackground ( Color.BLACK );
        repaint ();
    }
    
    /**
     * metodo que muestra el fin del juego.
     */
    public void juegoTerminado()
    {
        pausedOrOverGame(this.barraHerramientasAux2,true,CommandName.IMAGE_GAME_OVER);
    }
    /**
     * Metodo que crea los menus.
     */
    private void createMenu ()
    {
        JMenuBar menuBar = new JMenuBar ();
        List<MenuObject> menusObject = MenuStructure.getMenus ();
        for ( MenuObject menuObject : menusObject )
        {
            JMenu menu = this.addMenu ( menuObject );
            List<MenuObject> itemsObject = MenuStructure.getMenuItems ( menuObject );
            for ( MenuObject itemObject : itemsObject )
            {
                this.addMenuItem ( menu , itemObject );
            }
            menuBar.add ( menu );
        }
        super.setJMenuBar ( menuBar );
    }
    /**
     * Metodo que agrega menus 
     * @param menuObject objeto menu a agregar
     * @return menu con los objetos agregados.
     */
    private JMenu addMenu ( MenuObject menuObject )
    {
        JMenu menu = new JMenu ( menuObject.getName () );
        menu.setMnemonic ( menuObject.getMnemonic () );
        if ( menuObject.hasAccelerator () )
        {
            menu.setAccelerator ( menuObject.getAccelerator () );
        }
        return menu;
    }
    /**
     * metodo que muestra los puntajes por pantalla.
     */
    private void showPuntajes ()
    {
        JPuntaje puntaje = new JPuntaje ();
        
    }
    /**
     * metodo que muestra la ventana para ingresar nuevos puntajes.
     */
    public void showNewPuntaje ()
    {
        JNewPuntaje puntaje = new JNewPuntaje ( this.cronometro );
        puntaje.setVisible ( true );
        
    }
    /**
     * metodo que agrega items a un menu.
     * @param parent menu padre
     * @param itemObject  item a agregar.
     */
    private void addMenuItem ( JMenu parent , MenuObject itemObject )
    {
        if ( itemObject.isSeparator () )
        {
            parent.addSeparator ();
            return;
        }
        JMenuItem item = new JMenuItem ( itemObject.getName () );
        if ( itemObject.hasMnemonic () )
        {
            item.setMnemonic ( itemObject.getMnemonic () );
        }
        if ( itemObject.hasAccelerator () )
        {
            item.setAccelerator ( itemObject.getAccelerator () );
        }
        item.setActionCommand ( itemObject.getName () );
        item.addActionListener ( this );
        parent.add ( item );
    }
    /**
     * Metodo que para el cronometro de una barra de herramientas.
     */
    public void stopCronometro ()
    {
        this.barraHerramientas.stopCronometro ();
    }
    
    /**
     * Metodo que realiza una acciones cuando se clickean los menus.
     * @param ae actionlistener que llamo al metodo.
     */
    
    @Override
    public void actionPerformed ( ActionEvent ae )
    {
        String comando = ae.getActionCommand ();
        switch ( comando )
        {
            case CommandName.NUEVO:
                this.newGame ();
                break;
            case CommandName.SALIR:
                this.barraHerramientas.stopCronometro ();
                dispose ();
                System.exit ( 0 );
                break;
            case CommandName.ACERCA_DE:
                new JAbout ().setVisible ( true );
                break;
            case CommandName.AYUDA:
                new JHelp ().setVisible ( true );
                break;
            case CommandName.PUNTAJE:
                showPuntajes ();
                break;
            case CommandName.SOLUCION:
                this.panel.mostrarSolucion ();
                break;
            case CommandName.COLOR_GREEN:
                this.panel.setColor ( comando );
                break;
            case CommandName.COLOR_MAGENTA:
                this.panel.setColor ( comando );
                break;
            case CommandName.COLOR_RED:
                this.panel.setColor ( comando );
                break;
            case CommandName.COLOR_YELLOW:
                this.panel.setColor ( comando );
                break;
            case CommandName.COLOR_GRAY:
                this.panel.setColor ( comando );
                break;
            case CommandName.COLOR_CYAN:
                this.panel.setColor ( comando );
                break;
            case CommandName.COLOR_BLUE:
                this.panel.setColor ( comando );
                break;
            case CommandName.COLOR_BLACK:
                this.panel.setColor ( comando );
                break;
            case CommandName.DOS_DOS:
                this.panel.setTamaño ( comando );
                break;
            case CommandName.TRES_TRES:
                this.panel.setTamaño ( comando );
                break;
            case CommandName.CUATRO_CUATRO:
                this.panel.setTamaño ( comando );
                break;
            case CommandName.CINCO_CINCO:
                this.panel.setTamaño ( comando );
                break;
            case CommandName.SEIS_SEIS:
                this.panel.setTamaño ( comando );
                break;
            case CommandName.PAUSE:
                if ( !pause )
                {
                    pausedOrOverGame (this.barraHerramientasAux ,true, CommandName.ICON_PAUSED_GAME );
                    this.pause = true;
                }
                break;
            case CommandName.PLAY:
                pausedOrOverGame (this.barraHerramientasAux ,false, CommandName.ICON_PAUSED_GAME);
                pause = false;
                break;

        }
    }
}
